/*
 * p1755.cpp
 *
 *  Created on: 2013-3-21
 *      Author: zy
 */

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<vector>
#include<set>
using namespace std;
const double EPS = 1e-16;
const int maxn = 150;
int sig(double d)
{
	return fabs(d) < EPS ? 0 : d < 0 ? -1 : 1;
}

struct Point
{
	double x, y;
	Point()
	{
	}
	Point(double x, double y) :
		x(x), y(y)
	{
	}
	void set(double x, double y)
	{
		this->x = x;
		this->y = y;
	}
	double mod()
	{//模
		return sqrt(x * x + y * y);
	}
	double mod_pow()
	{//模的平方
		return x * x + y * y;
	}
	void output()
	{
		printf("x = %f, y = %f\n", x, y);
	}
	bool operator <(const Point &p) const
	{
		return sig(x - p.x) != 0 ? x < p.x : sig(y - p.y) < 0;
	}
};
double cross(Point o, Point a, Point b)
{
	return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}

/*
 判断直线a,b   和   c,d是否相交

 类型				返回	p
 --------------------------------------
 壹.	不相交（平行）		0		不变
 2.	规范相交			壹		交点
 3.	非规范相交（重合）	2		不变
 */
int lineCross(Point a, Point b, Point c, Point d, Point &p)
{
	double s1, s2;
	s1 = cross(a, b, c);
	s2 = cross(a, b, d);
	if (sig(s1) == 0 && sig(s2) == 0)
		return 2;
	if (sig(s2 - s1) == 0)
		return 0;
	p.x = (c.x * s2 - d.x * s1) / (s2 - s1);
	p.y = (c.y * s2 - d.y * s1) / (s2 - s1);
	return 1;
}
/**	下面开始计算半平面交!!!!!!!!!!!
 如果直线l1,l2,l3过一个点，未删除中间的那条边！（照顾点的退化情况）因此核可能有重复的点
 退化情况：
 1.如果是多边形，无大碍，参考calCore函数
 2.如果是线性规划，建议加入边界来约束
 */
/**
 精简了上面的calPolygon，只保留了area和shun的返回
 */
void calPolygon(Point*p, int num, double &area, bool &shun)
{
	p[num] = p[0];
	area = 0;
	double tmp;
	for (int i = 0; i < num; i++)
	{
		tmp = p[i].x * p[i + 1].y - p[i].y * p[i + 1].x;
		area += tmp;
	}
	area /= 2.0;
	if (shun = area < 0)
		area = -area;
}
/**
 一条直线，a和b再此直线上，并且a指向b
 angle指向了向量(a, b) 左面 的方向
 因此反映了半平面！！！
 */
struct Line
{
	Point a, b;
	double angle;
	Line()
	{
	}
	Line(Point a, Point b) :
		a(a), b(b)
	{
		angle = atan2(b.x - a.x, a.y - b.y);
	}
	bool operator <(const Line & l) const
	{
		return (angle - l.angle) != 0 ? angle < l.angle : cross(a, b, l.b) < 0;
	}
	/**
	 叉乘
	 */
	double operator *(const Line & l) const
	{
		return (b.x - a.x) * (l.b.y - l.a.y) - (l.b.x - l.a.x) * (b.y - a.y);
	}
};
/**
 zzy的副主函数，用于判断m点是否应该被弹出
 如果m和n平行，返回true
 如果m和n的交点严格再l之外，返回true
 如果m和n的交点严格再l之内，返回false
 如果m和n的交点再l上，则判断n和l的交是否完全被m包含，若是，返回true。此步具体做法：
 判断m和n在l的同侧，并且n和l再m的异侧
 （由于本算法是ax+by+c<=0的，如果计算ax+by+c<0，不要轻易改变out返回值，建议就这样计算，然后看面积是否为0）
 */
bool out(Line m, Line n, Line l)
{
	Point p;
	if (lineCross(m.a, m.b, n.a, n.b, p) != 1)
	{
		return true;
	}
	double d = cross(l.a, l.b, p);
	if (sig(d) != 0)
		return d < 0;
	double a = m * l, b = n * l, c = m * n;
	return sig(a) * sig(b) > 0 && sig(a) * sig(c) < 0;
}
/**
 用zzy大牛的方法计算半年平面交
 将传入的半平面原地筛选，选出有用的半平面
 参数：
 l:	传入的半平面，程序中将作为队列，程序结束保存有用的半平面
 n:	传入的半平面个数
 b:	计算后l的队列底
 t:	计算后l的队列顶
 [b, t]	闭区间！
 */
void zzy(Line* l, int n, int &b, int &t)
{
	sort(l, l + n);
	int i, j;
	for (i = 1, j = 0; i < n; i++)
		if (sig(l[i].angle - l[j].angle) != 0)
			l[++j] = l[i];
	for (b = 0, t = 1, i = 2; i <= j; i++)
	{
		while (b < t && out(l[t], l[t - 1], l[i]))
			t--;
		while (b < t && out(l[b], l[b + 1], l[i]))
			b++;
		l[++t] = l[i];
	}
	while (n != t - b)
	{
		n = t - b;
		while (b < t && out(l[t], l[t - 1], l[b]))
			t--;
		while (b < t && out(l[b], l[b + 1], l[t]))
			b++;
	}
}

double area(Point * p, int n)
{
	double res = 0;
	p[n] = p[0];
	for (int i = 0; i < n; i++)
	{
		res += p[i].x * p[i + 1].y - p[i + 1].x * p[i].y;
	}
	return res / 2;
}
double v[maxn], u[maxn], w[maxn];
Point p[maxn];
int n;
Line l[maxn];
int main()
{
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
			scanf("%lf%lf%lf", &v[i], &u[i], &w[i]);
		if (n == 1)
		{
			puts("Yes");
			continue;
		}
		int cnt;
		for (int k = 0; k < n; k++)
		{
			cnt = 0;
			bool flag = true;
			for (int i = 0; i < n; i++)
			{
				if (i == k)
					continue;
				double a, b, c, X0, Y0;
				Point A, B;
				a = (1 / v[k] - 1 / w[k]) - (1 / v[i] - 1 / w[i]);
				b = (1 / u[k] - 1 / w[k]) - (1 / u[i] - 1 / w[i]);
				c = (1 / w[k] - 1 / w[i]);
				if (sig(a) == 0 && sig(b) == 0)
				{
					if (c < 0)
						continue;
					else
					{
						flag = false;
						break;
					}
				}
				if (sig(c) == 0)
				{
					if (sig(a) == 0)
					{
						if (b > 0)
						{
							flag = false;
							break;
						}
						else
							continue;
					}
					if (sig(b) == 0)
					{
						if (a > 0)
						{
							flag = false;
							break;
						}
						else

							continue;

					}

					if (sig(a) < 0 && sig(b) < 0)
						continue;
					if (sig(a) > 0 && sig(b) > 0)
					{
						flag = false;
						break;
					}
					A = Point(0, 0);
					B = Point(1, -a / b);
					if (sig(a) > 0)
						l[cnt++] = Line(A, B);
					else
						l[cnt++] = Line(B, A);
					continue;
				}
				if (sig(a) == 0)
				{
					A = Point(0, -c / b);
					B = Point(1, -c / b);
					if (sig(b) > 0)
						l[cnt++] = Line(B, A);
					else
						l[cnt++] = Line(A, B);
					continue;
				}
				if (sig(b) == 0)
				{
					A = Point(-c / a, 0);
					B = Point(-c / a, 1);
					if (sig(a) > 0)
						l[cnt++] = Line(A, B);
					else
						l[cnt++] = Line(B, A);
					continue;
				}
				X0 = -c / a;
				Y0 = -c / b;
				A = Point(X0, 0);
				B = Point(0, Y0);
				if (sig(a) > 0)
				{
					if (sig(Y0 < 0))
						l[cnt++] = Line(B, A);
					else
						l[cnt++] = Line(A, B);
				}
				else
				{
					if (sig(Y0 < 0))
						l[cnt++] = Line(A, B);
					else
						l[cnt++] = Line(B, A);
				}

			}
			l[cnt++] = Line(Point(0, 1), Point(0, 0));
			l[cnt++] = Line(Point(0, 0), Point(1, 0));
			l[cnt++] = Line(Point(1, 0), Point(0, 1));
			if (!flag)
			{
				puts("No");
				continue;
			}
			int b, t;
			zzy(l, cnt, b, t);
			l[t + 1] = l[b];
			cnt = t - b + 1;
			if (cnt < 3)
			{
				puts("No");
				continue;
			}
			for (int i = b; i <= t; i++)
			{
				lineCross(l[i].a, l[i].b, l[i + 1].a, l[i + 1].b, p[i - b]);
			}
			if (sig(area(p, cnt)) != 0)
				puts("Yes");
			else
				puts("No");
		}
	}
	return 0;
}
